package com.bonshotels.DomainLayer.DomainModel;

import java.io.Serializable;

/**
 * La classe DescompteVariable te el rol de estrategia concreta dins del patro estrategia, per aquest
 * motiu implementa la interficie de l'estrategia IEstrategiaCalculPreu.
 * Com que utilitzem el framework de persistencia
 * Hibernate i aquest utilitza reflexio per fer la seva feina les nostres classes han d'acomplir una
 * serie de propietats perque la reflexio del Hibernate pugui fer completament la seva feina, les
 * classes han de ser publiques, han de tenir un constructor public buit (si no en tenen un d'explicit
 * el per defecte ja ho es), han d'implementar Serializable, i han de tenir substituits (override) els
 * metodes equals() i hashCode() perque identifiquin les classes a partir de la seva clau natural.
 * Com que DescompteVarible s'identifica pel descompteVariable l'hem fet servir a l'hora
 * d'implementar equals(), hashCode().
 * A diferencia del disseny de la entrega 3 la interficie IEstrategiaClaculPreu i les seves
 * realitzacions han passat a utilitzar una estrategia de mappeig del tipus Class Table Inheritance
 * utilitzant una taula per guardar tots els id de les realitzacions de IEstrategiaCalculPreu.
 * Els metodes getId i setId apareixen d'implementar els metodes creats a la interficie
 * IEstrategiaCalculPreu perque el Hibernate pugui assignar claus que no es solapin a totes
 * les instancies de classes que l'implementen.
 * 
 * @author Marc Mauri Alloza
 */
public class DescompteVariable implements IEstrategiaCalculPreu, Serializable {

	/** La constant serialVersionUID. */
	private static final long serialVersionUID = -5362305666296761791L;

	/** L'id. */
	private long id;
	
	/** El descompte variable que s'aplica al preu base per nit. */
	private float descompteVariable;
	
	/**
	 * Calcula el preu final per nit a partir del preu base per nit i aplicant el desmpte variable.
	 *
	 * @param preu El preu base per nit.
	 * @return El preu final per nit.
	 */
	public float calcularPreu(float preu) {
		return preu - preu*descompteVariable/100;
	}

	/**
	 * Getter de descompte variable.
	 *
	 * @return El descompte variable
	 */
	public float getDescompteVariable() {
		return descompteVariable;
	}

	/**
	 * Setter de descompte variable.
	 *
	 * @param descompteVariable the new descompte variable
	 */
	public void setDescompteVariable(float descompteVariable) {
		this.descompteVariable = descompteVariable;
	}

	/* (non-Javadoc)
	 * @see com.bonshotels.DomainLayer.DomainModel.IEstrategiaCalculPreu#getId()
	 */
	@Override
	public long getId() {
		return id;
	}

	/* (non-Javadoc)
	 * @see com.bonshotels.DomainLayer.DomainModel.IEstrategiaCalculPreu#setId(long)
	 */
	@Override
	public void setId(long id) {
		this.id = id;		
	}
	
	/**
	 * Getter de serialversionuid.
	 *
	 * @return El serialversionuid
	 */
	public static long getSerialversionuid() {
		return serialVersionUID;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + (int) (id ^ (id >>> 32));
		return result;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		DescompteVariable other = (DescompteVariable) obj;
		if (id != other.id)
			return false;
		return true;
	}

}
